package com.docparser.processor;

/**
 * 格式化LaTeX公式。
 */
public class FormulaFormatter {
    /**
     * 格式化并清理LaTeX公式。
     */
    public static String format(String formula) {
        if (formula == null) return "";

        // 预处理：基础格式化
        String result = formula
            .replaceAll("\\s+", " ")  // 合并多个空格
            .replaceAll("\\\\frac\\s*\\\\", "\\frac") // 修复frac命令
            .replaceAll("\\\\frac\\s*\\{", "\\frac{") // 确保frac和大括号之间没有空格
            .replaceAll("\\}\\s*\\{", "}{") // 确保相邻的大括号之间没有空格
            .replaceAll("\\\\\\{", "{") // 移除多余的反斜杠
            .replaceAll("\\\\\\}", "}"); // 移除多余的反斜杠

        // 第一步：处理数学函数和特殊字符
        result = processBasicElements(result);
        
        // 第二步：处理括号和分隔符
        result = processDelimiters(result);
        
        // 第三步：处理上下标
        result = processScripts(result);
        
        // 第四步：最终格式化
        result = formatFinal(result);

        return result.trim();
    }

    private static String processBasicElements(String formula) {
        // 基本元素替换
        String result = formula
            .replaceAll("\\\\\\\\", "\\\\")
            .replaceAll("π", "\\\\pi ")
            .replaceAll("∞", "\\\\infty ")
            .replaceAll("[…⋯]", "\\\\cdots")
            .replaceAll("\\.\\.\\.", "\\\\cdots")
            .replaceAll("×", "\\\\times ")
            .replaceAll("·", "\\\\cdot ")
            .replaceAll("±", "\\\\pm ")
            .replaceAll("∓", "\\\\mp ");
            
        // 处理 \over 到 \frac 的转换
        if (result.contains("\\over")) {
            // 匹配 \over 前后的表达式
            String[] parts = result.split("\\\\over");
            if (parts.length == 2) {
                // 提取分子和分母
                String numerator = parts[0].trim();
                String denominator = parts[1].trim();
                
                // 如果分子以 { 开始且以 } 结束，去掉外层括号
                if (numerator.startsWith("{") && numerator.endsWith("}")) {
                    numerator = numerator.substring(1, numerator.length() - 1);
                }
                
                // 如果分母以 { 开始且以 } 结束，去掉外层括号
                if (denominator.startsWith("{") && denominator.endsWith("}")) {
                    denominator = denominator.substring(1, denominator.length() - 1);
                }
                
                // 构造 \frac 形式
                result = result.replace(parts[0] + "\\over" + parts[1], 
                    "\\frac{" + numerator + "}{" + denominator + "}");
            }
        }
        
        return result;
    }

    private static String processDelimiters(String formula) {
        // 检查括号匹配和嵌套
        String result = formula
            .replaceAll("(?<!\\\\)\\{", "\\\\{")
            .replaceAll("(?<!\\\\)\\}", "\\\\}");

        // 移除多余的 \right 标记
        result = result.replaceAll("\\\\right(?![\\(\\)\\[\\]\\{\\}\\|\\.])", "");
        
        // 移除多余的 \left 标记
        result = result.replaceAll("\\\\left(?![\\(\\)\\[\\]\\{\\}\\|\\.])", "");
        
        // 确保左右括号配对
        result = result.replaceAll("(\\\\left|\\\\right)(?![\\(\\)\\[\\]\\{\\}\\|])", "$1.");
        
        return result;
    }

    private static String processScripts(String formula) {
        return formula
            // 处理上标
            .replaceAll("\\^([a-zA-Z0-9])(?![}\\)])", "^{$1}")  // 单字符上标
            .replaceAll("\\^([a-zA-Z0-9]{2,})(?![}\\)])", "^{$1}")  // 多字符上标
            .replaceAll("\\^\\{([^{}]+)\\}\\^", "^{$1^")  // 嵌套上标
            
            // 处理下标
            .replaceAll("_([a-zA-Z0-9])(?![}\\)])", "_{$1}")  // 单字符下标
            .replaceAll("_([a-zA-Z0-9]{2,})(?![}\\)])", "_{$1}")  // 多字符下标
            .replaceAll("_\\{([^{}]+)\\}_", "_{$1_")  // 嵌套下标
            
            // 处理特殊情况
            .replaceAll("([a-zA-Z0-9])\\^2", "$1^2")  // 平方不需要花括号
            .replaceAll("([a-zA-Z0-9])\\^3", "$1^3")  // 立方不需要花括号
            .replaceAll("\\\\sin\\^2", "\\\\sin^2")  // 三角函数的平方
            .replaceAll("\\\\cos\\^2", "\\\\cos^2")  // 三角函数的平方
            
            // 处理混合上下标
            .replaceAll("(\\^|_)\\{([^{}]+)\\}(\\^|_)\\{", "$1{$2}$3{")
            .replaceAll("([a-zA-Z0-9])_(\\d+)\\^(\\d+)", "$1_{$2}^{$3}");  // 数字混合上下标
    }

    private static String formatFinal(String formula) {
        String result = formula
            // 处理数学运算符
            .replaceAll("±", "\\\\pm ")
            .replaceAll("−", "-")
            // 处理多余的右定界符
            .replaceAll("\\\\right\\}", "}")
            // 处理空格
            .replaceAll("\\s+", " ")
            .replaceAll("\\s*([+\\-=<>])\\s*", " $1 ")
            .replaceAll("\\s*\\{\\s*", "{")
            .replaceAll("\\s*}\\s*", "}")
            // 修复函数表达式
            .replaceAll("\\\\([a-zA-Z]+)\\s+\\{", "\\\\$1{")
            // 修复括号问题
            .replaceAll("\\{\\s*\\\\frac", "\\\\frac")
            .replaceAll("\\}\\s*\\}", "}");
            
        return result;
    }
}
